In many environments, applications are designed to execute as multiple streams/threads of execution, with each thread representing a portion of the application that may execute concurrently with other portions/threads. Such applications are referred to as multi-threaded applications, with the multiple threads in an application sharing resources such as memory, IO devices, etc. One reason for having multiple threads in an application is to perform multiple tasks concurrently. As such, in the event that a multi-threaded application needs to be stopped, it is desirable that the application is “gracefully” stopped only after the currently performing tasks/threads are completed.